﻿using System;

namespace _21____面向对象___三大特性
{
    class Program
    {
        static void Main(string[] args)
        {
            Person student = new Student("柯南"); //里氏转换，父类为子类代言，而以下不能犯上 
            Person teacher = new Teacher("老王"); 

            Person[] peoples = 
               {
                student,
                teacher
            };

            foreach (var item in peoples)
            {
                item.Eat("筷子", "米饭"); // 因为继承，所以有相同的行为（接口），故而可以遍历
            }


        }
        //什么是面向对象：把数字世界和真实世界一一对应（映射），
        // 因为这三大特性，我们有机会、有可能整出面向对象，与真实世界一一对应。
        // 那三大特性：封装、继承、多态
        // 封装：封存装载，把一个事物包装起来，在程序中，他是把一些行为进行整合。
        // 继承：继续+传承 ，可以获得被继承人的部分东西，在程序中，一个 class“：”class 就是继承
        // 多态： 多个形态，比如：父辈吃饭用筷子，子代用叉 同样是吃饭的行为，父子间呈现了多种不一样的操作
        // virtual / override  

        class Person
        {
            public string name;
            public virtual void Eat(string 方式,string food)  //封装
            {

                Console.WriteLine($"人类需要吃饭,用 {方式} 吃 {food}");
            }
        }

        class Student : Person  // 继承，传承父级的行为
        {
            public Student(string name) 
            {
                this.name = name;
            }
            public override void Eat(string 方式, string food) // 多态的体验，把行为重新定义
            {
                Console.WriteLine($"{name} 走着吃  = {food}");
            }
        }

        class Teacher : Person 
        {
            public Teacher(string  name) 
            {
                this.name = name;
            }
            public override void Eat(string 方式, string food)
            {
                Console.WriteLine($"{name} 教职工餐厅 {方式} = {food}");
            }
        }








    }
}
